iT邦幫忙

2022 iThome 鐵人賽

DAY 19
2
DevOps

從零開始的 Jenkins 之旅系列 第 19

第十九天 Jenkins 之旅:Docker Pipeline

  • 分享至 

  • xImage
  •  

在昨天 Multibranch Pipeline 的示範中,可以發現我們為了做測試環境是非常的煞費苦心,而且為了要做出 python 的 virtualenv,我們的 Jenkins agent 也必須先安裝對應的 python 版本,
例如: 我們想要有 python3.7.11 的虛擬環境,則 agent 就必須先安裝 python3.7.11,但是當我們有要測試 python3.8 時,則必須先額外裝 python3.8 ...... 老實說不是不可以,只是很容易一個不小心把整台 jenkins agent 安裝的亂七八糟的 QQ
所以今天我們要用更加彈性的方式來做我們的測試環境 - Docker Pipeline

pipeline{
    ......
        stage("Setup virtual env"){
            steps{
                sh '''#!/bin/bash
                virtualenv venv
                source venv/bin/activate
                pip3 install -r requirements.txt
                pip3 install pylint
                pip3 install pytest
                '''
            }
        }
        stage("Lint"){
            steps{
                sh '''
                source venv/bin/activate
                export PYTHONPATH=${PWD}
                pylint --fail-under=10 src
                '''
            }
        }
        stage("Test"){
            steps{
                sh '''
                source venv/bin/activate
                export PYTHONPATH=${PWD}
                pytest tests
                '''
            }
        }
    ......
}

Docker Pipeline 之前

在說到 Docker Pipeline 之前我們先來前情提要一下,在我們一般下的 docker 指令,其實我們是對他底層的 demaon unix:///var/run/docker.sock 進行操作,例如 docker ps => curl {{ DOCKER_HOST }}:2375/images/json

● docker.service - Docker Application Container Engine
     Loaded: loaded (/lib/systemd/system/docker.service; enabled; vendor preset: enabled)
     Active: active (running) since Mon 2022-08-29 08:36:25 UTC; 3 weeks 0 days ago
TriggeredBy: ● docker.socket
       Docs: https://docs.docker.com
   Main PID: 18233 (dockerd)
      Tasks: 10
     Memory: 171.8M
     CGroup: /system.slice/docker.service
             └─18233 /usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock

故一般我們在操作 docker 指令,就是和本地的 Daemon 去做交互行為。並且一般的 docker daemon 預設並不會公開給其他 server 使用,但是為了要讓我們實作遠端操作 docker daemon,接下來會教大家如何開啟 docker daemon 的 tcp 接口。

為了講解方便,故審略 security 的部分,故以下內容只建議在測試環境運行

  1. 進入我們想要 expose docker 服務的 linux console
sudo systemctl edit docker.service
  1. 設置以下內容
[Service]
ExecStart=
ExecStart=/usr/bin/dockerd -H fd:// -H tcp://0.0.0.0:4243
  1. 重新啟動 docker 服務
sudo systemctl daemon-reload
systemctl restart docker
  1. 測試是否可以正常 requests 本地 docker daemon api。
    https://ithelp.ithome.com.tw/upload/images/20220919/201516134VupKM3pr0.png

  2. 進入 client 機 export DOCKER_HOST="tcp://{{ docker-cloud }}:4243",可以發現我們可以在 client 端用 docker images 正確提取遠端內容。
    https://ithelp.ithome.com.tw/upload/images/20220919/201516139lAGixSFyW.png

設定 Docker Pipeline

  1. 安裝 Jenkins plugin - Docker pipeline
  2. 進入 Manager Jenkins >> Manage nodes and clouds
  3. 點選左方選單的 Configure Clouds,並在 Add a new cloud 中選擇 Docker。
    https://ithelp.ithome.com.tw/upload/images/20220919/20151613lTWC0p7yzt.png
  4. 進入到設定畫面。
    https://ithelp.ithome.com.tw/upload/images/20220919/20151613SlzgUwjiDy.png

這裡的 Docker Host URI 我們可以想成是 export DOCKER_HOST ,所以在裡面輸入 tcp://{{ docker-cloud }}:4243,並設定對應 docker 最新API 版本號,參考設定如下:
https://ithelp.ithome.com.tw/upload/images/20220919/20151613NG5TcdtPfF.png

備註:

  1. Jenkins Agent 本身必須裝 Docker
    https://ithelp.ithome.com.tw/upload/images/20220919/20151613H7rW1ejMgX.png
  2. 確保 Jenkins Agent 的 Usage 狀態為 Use this node as much as possible
    https://ithelp.ithome.com.tw/upload/images/20220919/20151613BiwB2kVn2E.png

測試 docker pipeline

範例用 Jenkinsfile

pipeline {
    agent none
    stages {
        stage('Build') {
            agent {
                docker { image 'gradle:6.7-jdk11' }
            }
            steps {
                sh 'gradle --version'
            }
        }
    }
}

https://ithelp.ithome.com.tw/upload/images/20220919/20151613T04lMf8dEH.png

小結

在 Docker Pipeline 的加持之下,讓 Jenkins CI 的有了更多的可能性,明天我們將會重構 ithome-crawler 的 CI pipeline。

參考資料

https://www.evanlin.com/til-docker-remote-api/
https://hackmd.io/@JYU/B1w9NDGnD


上一篇
第十八天 Jenkins 之旅:Multibranch Pipeline
下一篇
第二十天 Jenkins 之旅:Multibranch Pipeline (2)
系列文
從零開始的 Jenkins 之旅30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言